@lobehub/chat
Version:
Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.
55 lines (45 loc) • 1.99 kB
text/typescript
interface DimensionConstraints {
height: { max: number; min: number };
width: { max: number; min: number };
}
/**
* Adjust image dimensions to fit within model constraints while maintaining aspect ratio
* @param originalWidth Original image width
* @param originalHeight Original image height
* @param constraints Width and height constraints from model schema
* @returns Adjusted dimensions within constraints
*/
export const constrainDimensions = (
originalWidth: number,
originalHeight: number,
constraints: DimensionConstraints,
): { height: number; width: number } => {
let width = originalWidth;
let height = originalHeight;
// First, scale down if exceeding maximum values
if (width > constraints.width.max || height > constraints.height.max) {
const scaleX = constraints.width.max / width;
const scaleY = constraints.height.max / height;
const scale = Math.min(scaleX, scaleY);
width = Math.round(width * scale);
height = Math.round(height * scale);
}
// Then, scale up if below minimum values
if (width < constraints.width.min || height < constraints.height.min) {
const scaleX = constraints.width.min / width;
const scaleY = constraints.height.min / height;
const scale = Math.max(scaleX, scaleY);
width = Math.round(width * scale);
height = Math.round(height * scale);
}
// Ensure final values are within bounds (may need adjustment due to rounding)
width = Math.max(constraints.width.min, Math.min(constraints.width.max, width));
height = Math.max(constraints.height.min, Math.min(constraints.height.max, height));
// Round to nearest multiple of 8 (common model requirement)
width = Math.round(width / 8) * 8;
height = Math.round(height / 8) * 8;
// Final bounds check after rounding
width = Math.max(constraints.width.min, Math.min(constraints.width.max, width));
height = Math.max(constraints.height.min, Math.min(constraints.height.max, height));
return { height, width };
};